Na aula passada, vimos que os domicílios são a unidade amostral, enquando as unidades de consumo (UC) são a unidade básica de pesquisa. Em linhas gerais, isso significa que a seleção de pessoas entrevistadas pela POF se dá pela seleção dos domicílio, no procedimento descrito anteriormente. E que as informações da pesquisa são agregadas, no nível mais básico, por unidades de consumo. Ou seja, ao contrário da PNAD Contínua Anual, na qual a renda per capita (por exemplo) significa a renda média dos moradores de um mesmo domicílio, na POF ela significa a renda média dos membros da unidade de consumo.
Um domicílio contém ao menos uma unidade de consumo, e toda unidade de consumo pertence a um e apenas um domicílio. Analogamente, uma unidade de consumo contém ao menos uma pessoa, e toda pessoa pertence a uma e apenas uma unidade de consumo.
Nessa discussão, dois registros são centrais. O primeiro é DOMICÍLIO, que contém dados sobre todos os domicílios da amostra, como água corrente, coleta de lixo e energia elétrica. Nesse registro, cada linha é um domicílio (o total de linhas é o total de domicílios na amostra da POF). O segundo é MORADOR, que contém dados de todas as pessoas da amostra, como idade, anos de estudo e se lancha na creche. Nesse registro, cada linha é uma pessoa, e o total de linhas é o total de pessoas na amostra da POF. Não há um registro “unidades de consumo”.
Assim, precisamos criar indicadores que permitam identificar os domicílios, unidades de consumo e pessoas entre os diferentes registros da POF (no último caso, nem sempre será possível).
Primeiro, vamos carregar os dois registros da POF
library(tidyverse)
pof_domicilio <- read_rds("./dados/pof_domicilio.rds")
pof_morador <- read_rds("./dados/pof_morador.rds")
Como a pof_domicilio tem o domicílio como maior nível de desagregação, só poderemos criar um identificador de domicílio (id_dom). Basicamente o id_dom é composto pelo identificador da UPA e pelo número do domicílio naquela UPA.
A função str_c agrupa conjuntos de caracteres. É
semelhante ao CONCATENAR do Excel. A função
n_distinct retorna o número de valores distintos da
variável e n retorna o número de elementos (no caso de um
df, o número de linhas)
pof_domicilio <- pof_domicilio %>%
mutate(id_dom = str_c(COD_UPA, NUM_DOM))
pof_domicilio %>%
summarise(numero_domicilios = n_distinct(id_dom),
numero_linhas = n())
## # A tibble: 1 × 2
## numero_domicilios numero_linhas
## <int> <int>
## 1 57920 57920
Como podemos ver, os números são iguais.
Agora na pof_morador, podemos criar identificadores de domicílio (id_dom), de unidade de consumo (id_uc) e de pessoas (id_pes).
pof_morador <- pof_morador %>%
mutate(id_dom = str_c(COD_UPA, NUM_DOM),
id_uc = str_c(COD_UPA, NUM_DOM, NUM_UC),
id_pes = str_c(COD_UPA, NUM_DOM, NUM_UC, COD_INFORMANTE))
pof_morador %>%
summarise(numero_domicilios = n_distinct(id_dom),
numero_uc = n_distinct(id_uc),
numero_pessoas = n_distinct(id_pes),
numero_linhas = n())
## # A tibble: 1 × 4
## numero_domicilios numero_uc numero_pessoas numero_linhas
## <int> <int> <int> <int>
## 1 57920 58039 178419 178431
O número de domicílios é o mesmo do registro pof_domicílios - está correto. Mas o número de pessoas não está igual ao número de linhas. Qual foi o erro? O erro é um problema no tamanho das variáveis NUM_DOM, NUM_UC e COD_INFORMANTE.
pof_morador %>%
group_by(id_pes) %>%
mutate(x = n()) %>%
ungroup() %>%
filter(x > 1) %>%
select(COD_UPA, NUM_DOM, NUM_UC, COD_INFORMANTE, id_pes) %>%
arrange(id_pes)
## # A tibble: 24 × 5
## COD_UPA NUM_DOM NUM_UC COD_INFORMANTE id_pes
## <chr> <chr> <chr> <chr> <chr>
## 1 120005467 1 1 11 1200054671111
## 2 120005467 11 1 1 1200054671111
## 3 130017335 1 1 11 1300173351111
## 4 130017335 11 1 1 1300173351111
## 5 130017335 1 1 12 1300173351112
## 6 130017335 11 1 2 1300173351112
## 7 130017335 1 1 13 1300173351113
## 8 130017335 11 1 3 1300173351113
...
Pegando as primeiras duas linhas como exemplo, vemos que o erro é
causado pela combinação do mesmo valor para COD_UPA e
NUM_UC com, em um caso NUM_DOM == 11 e
COD_INFORMANTE == 1 e, no outro, NUM_DOM == 1
e COD_INFORMANTE == 11, gerando assim o mesmo
id_pes para duas pessoas diferentes.
Para resolver isso, basta termos todos os valores de NUM_DOM, NUM_UC e COD_INFORMANTE com dois dígitos (01 ao invés de 1). Lembrando que precisamos dessa alteração em todos os registros da POF, pois esses indicadores são nossas chaves para agregar as diferentes tabelas.
Fazemos então
pof_domicilio <- pof_domicilio %>%
mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
id_dom = str_c(COD_UPA, NUM_DOM))
pof_morador <- pof_morador %>%
mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
COD_INFORMANTE = str_pad(COD_INFORMANTE, 2, "left", "0"),
id_dom = str_c(COD_UPA, NUM_DOM),
id_uc = str_c(COD_UPA, NUM_DOM, NUM_UC),
id_pes = str_c(COD_UPA, NUM_DOM, NUM_UC, COD_INFORMANTE))
pof_domicilio %>%
summarise(numero_domicilios = n_distinct(id_dom),
numero_linhas = n())
## # A tibble: 1 × 2
## numero_domicilios numero_linhas
## <int> <int>
## 1 57920 57920
pof_morador %>%
summarise(numero_domicilios = n_distinct(id_dom),
numero_uc = n_distinct(id_uc),
numero_pessoas = n_distinct(id_pes),
numero_linhas = n())
## # A tibble: 1 × 4
## numero_domicilios numero_uc numero_pessoas numero_linhas
## <int> <int> <int> <int>
## 1 57920 58039 178431 178431
Problema resolvido. De fato, é tedioso fazer isso toda vez que for ler a POF. No entanto, é importante mostrar pequenos erros que podem ter efeitos negativos na nossa análise.
Para termos certeza de que estamos usando o número certo de unidades de consumo e de pessoas, podemos tentar replicar algumas tabelas do SIDRA. Como exemplo, vamos fazer o total de famílias e o tamanho médio de famílias para o Brasil e para a Paraíba. A tabela de referência no SIDRA é a 6977 e pode ser acessada clicando aqui.
pof_morador %>%
group_by(id_uc) %>%
mutate(n_uc = n(),
PESO_FINAL = as.numeric(PESO_FINAL)) %>%
ungroup() %>%
filter(V0306 == "1") %>%
summarise(total_uc = sum(PESO_FINAL),
tamanho_medio = round(sum(n_uc*PESO_FINAL)/sum(PESO_FINAL),2))
## # A tibble: 1 × 2
## total_uc tamanho_medio
## <dbl> <dbl>
## 1 69017704. 3
pof_morador %>%
filter(UF == "25") %>%
group_by(id_uc) %>%
mutate(n_uc = n(),
PESO_FINAL = as.numeric(PESO_FINAL)) %>%
ungroup() %>%
filter(V0306 == "1") %>%
summarise(total_uc = sum(PESO_FINAL),
tamanho_medio = round(sum(n_uc*PESO_FINAL)/sum(PESO_FINAL),2))
## # A tibble: 1 × 2
## total_uc tamanho_medio
## <dbl> <dbl>
## 1 1265385. 3.13
Antes de falar sobre como calcular as despesas, vale demonstrar a
integração entre os diferentes registros. Para analisarmos o valor e
composição de despesas de diferentes grupos populacionais, precisamos de
informações de pessoas, famílias e domicílios. Assim, é preciso integrar
as informações de despesa, que estão nos registros Aluguel
estimado, Caderneta coletiva, Despesa coletiva,
Despesa individual, Rendimento do trabalho e
Outros rendimentos aos registros Morador e
Domicílio. Isso é feito por meio das variáveis indicadoras
id_dom e id_uc. Vamos usar como exemplo os
registros Morador e Aluguel estimado.
pof_aluguel_estimado <- read_rds("./dados/pof_aluguel_estimado.rds") %>%
mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
id_dom = str_c(COD_UPA, NUM_DOM),
id_uc = str_c(COD_UPA, NUM_DOM, NUM_UC))
pof_join <- pof_morador %>%
left_join(pof_aluguel_estimado, by = "id_uc")
Percebam que, aqui, eu usei o left_join, com
pof_morador no primeiro argumento. Isso vem porque queremos
preservar todas as linhas dessa tabela, para podermos separar os gastos
por características das pessoas e das famílias.
Para começar a olhar as despesas, temos três arquivos centrais:
indice <- readxl::read_xls("./memoria_de_calculo/Indice_Despesa.xls")
tradutor <- readxl::read_xls("./tradutores/Tradutor_Despesa_Geral.xls")
cadastro <- readxl::read_xls("./documentacao/Cadastro de Produtos.xls",
col_types = "text")
O cadastro de produtos relaciona o código do produto com sua respectiva descrição e o quadro no qual o produto se encontra.
cadastro
## # A tibble: 13,474 × 3
## QUADRO `CÓDIGO DO PRODUTO` `DESCRIÇÃO DO PRODUTO`
## <chr> <chr> <chr>
## 1 0 000101 ALUGUEL ESTIMADO
## 2 6 600101 ENERGIA ELETRICA (KWH)
## 3 6 600201 AGUA E ESGOTO
## 4 6 600301 GAS ENCANADO
## 5 6 600401 TELEFONE FIXO
## 6 6 600501 ACESSO A INTERNET (DISCADA, BANDA LARGA, VIA SATE…
...
A tabela indice apenas relaciona o nível de desagregação da despesa com sua respectiva descrição.
indice
## # A tibble: 93 × 3
## INDICE NIVEL DESCRICAO
## <dbl> <dbl> <chr>
## 1 1 0 DESPESA TOTAL
## 2 2 1 DESPESAS CORRENTES
## 3 3 11 DESPESAS DE CONSUMO
## 4 4 1101 ALIMENTACAO
## 5 5 1102 HABITACAO
## 6 6 110201 ALUGUEL
...
Por fim, a tabela mais importante para nós é a tradutor, pois ela contém todas as informações que precisamos para conduzir uma análise de despesa.
tradutor
## # A tibble: 5,318 × 14
## Codigo Variavel Nivel_0 Descricao_0 Nivel_1 Descricao_1 Nivel_2 Descricao_2
## <dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl> <chr>
## 1 10001 V8000_DEF… 0 Despesa To… 1 Despesas C… 11 Despesas d…
## 2 10004 V8000_DEF… 0 Despesa To… 1 Despesas C… 11 Despesas d…
## 3 10002 V8000_DEF… 0 Despesa To… 1 Despesas C… 11 Despesas d…
## 4 10009 V8000_DEF… 0 Despesa To… 1 Despesas C… 11 Despesas d…
## 5 1 V8000_DEF… 0 Despesa To… 1 Despesas C… 11 Despesas d…
## 6 10005 V8000_DEF… 0 Despesa To… 1 Despesas C… 11 Despesas d…
...
Na POF, cada item é registrado com um código de 7 dígitos, identificado pela variável V9001. Os dois primeiros dígitos são correspondentes ao quadro, enquanto os outros 5 são identificadores de cada item de despesa. Porém, olhando a tabela cadastro, vemos que alguns código possuem menos de 7 dígitos. Isso é causado pela mesma questão que aconteceu com as variáveis indicadoras. Se o número do quadro é 6 (por exemplo), o código fica com 6 dígitos (porque o dado não carrega como “06”). Então, para evitar quaisquer problemas, vamos transformar todos os códigos em 7 dígitos
cadastro <- cadastro %>%
janitor::clean_names() %>%
mutate(codigo_7 = str_pad(codigo_do_produto, 7, "left", "0"))
A tabela tradutor também tem valores de código com menos de 7 dígitos. Em parte, isso também é causado por essa questão do número do quadro ter menos de 2 dígitos. No entanto, a principal questão é que não foram incluídos em 2 últimos dígitos de cada item. Essencialmente, itens muito semelhantes (ou da mesma natureza) foram agrupados nos códigos de 5 dígitos. Vamos ver alguns exemplos disso, usando a tabela cadastro.
cadastro <- cadastro %>%
mutate(codigo_5 = str_sub(codigo_7, 1, -3))
cadastro %>%
group_by(codigo_5) %>%
mutate(n = n()) %>%
ungroup() %>%
filter(n > 1) %>%
arrange(n, codigo_5)
## # A tibble: 9,938 × 6
## quadro codigo_do_produto descricao_do_produto codigo_7 codigo_5 n
## <chr> <chr> <chr> <chr> <chr> <int>
## 1 7 700101 GAS DE BOTIJAO (COMBUSTIVEL… 0700101 07001 2
## 2 7 700102 GAS DE BUJAO (COMBUSTIVEL D… 0700102 07001 2
## 3 7 700201 AGUA PARA USO GERAL 0700201 07002 2
## 4 7 700202 PIPA DE AGUA 0700202 07002 2
## 5 7 701001 GAS DE BOTIJAO PARA ILUMINA… 0701001 07010 2
## 6 7 701002 GAS DE BUJAO PARA ILUMINACAO 0701002 07010 2
## 7 8 800201 TIJOLO (PEQUENOS REPAROS) 0800201 08002 2
## 8 8 800202 BLOCO DE CERAMICA (PEQUENOS… 0800202 08002 2
## 9 8 800801 TINTA (PEQUENOS REPAROS) 0800801 08008 2
## 10 8 800802 VERNIZ (PEQUENOS REPAROS) 0800802 08008 2
...
Como exemplos, temos gás de botijão e gás de bujão e tinta (pequenos reparos) e verniz (pequenos reparos).
Assim, precisamos transformar os códigos da tabela tradutor em 5 dígitos - e é esse que usaremos para analisar os dados da POF
tradutor <- tradutor %>%
janitor::clean_names() %>%
mutate(codigo = str_pad(codigo, 5, "left", "0"),
descricao_2 = case_when(descricao_2 == "Despesas de consumo" ~ "Despesas de Consumo",
TRUE ~ descricao_2))
Agora que temos os códigos de 5 dígitos na tabela tradutor, falta uma informação para começarmos a analisar as despesas - a variável relevante de cada gasto. Basicamente, a POF analisa:
Existem alguns itens que têm mais de uma variável - que representam
gastos de categorias e classificações diferentes. Por exemplo, gastos de
manutenção do lar com eletricista envolvem o valor da despesa
(V8000_DEFLA), associado à categoria Despesa Total >
Despesas Correntes > Despesas de Consumo > Habitação >
Manutenção do lar e recolhimento de INSS
(V1904_DEFLA), associado à categoria Despesa Total >
Despesas Correntes > Outras despesas correntes > Contribuições
trabalhistas.
Assim, além do código, precisamos acertar a variável na hora de calcular as despesas.
Os últimos pontos antes de realizar a análise das despesas são a deflação e a anualização. Como dito na primeira aula, as informações da POF se distribuem ao longo de 24 meses, sendo estabelecido o dia 15 de janeiro de 2018 como data de refrência. Assim, todos os valores precisam ser deflacionados para representarem valores médios desta data. Por sorte, o IBGE já disponibiliza os valores deflacionados: são as variáveis que olhamos acima e que estão na tabela despesa.
A anualização, por sua vez, vem do fato de existirem 4 períodos de
referência para despesas: 7, 30 e 90 dias e 12 meses. Respectivamente,
precisamos multiplicar o valor da despesa em cada um desses períodos por
52, 12, 4 ou 1 (variável FATOR_ANUALIZACAO). Para alguns
itens de despesas de 12 meses (FATOR_ANUALIZACAO == 1),
temos também o número de meses de realização da despesa (variável
V9011). Para saber quais itens se encaixam nesse segundo
caso, o dicionário de variáveis explicita os quadros que precisam da
variável V9011 - podemos também olhar no código fornecido
pelo IBGE memoria_de_calculo/R/Tabela de Despesa Geral.R.
OK! Agora temos tudo o que precisamos.
Basicamente, o processo se resume em:
Como as possibilidades são virtualmente infinitas, vamos focar na tabela 6715 do SIDRA.
Já vimos como ler os microdados e até ja criamos arquivos .rds. Em um momento futuro, podemos salvar ainda mais tempo e espaço criando arquivos .rds de microdados apenas com as colunas relevantes para a análise de despesa, mas isso fica na conta de caa um. O que precisa ser feito agora é saber quais os arquivos de microdados relevantes.
Basicamente, precisamos de todos os registros da POF que possuem alguma das variáveis explicitadas na tabela tradutor. A saber:
tradutor %>%
distinct(variavel)
## # A tibble: 6 × 1
## variavel
## <chr>
## 1 V8000_DEFLA
## 2 V531122_DEFLA
## 3 V531132_DEFLA
## 4 V1904_DEFLA
## 5 V531112_DEFLA
## 6 V8501_DEFLA
Podemos também olhar em memoria_de_calculo > R > Tabela de Despesa Geral.R.
Os registros relevantes são:
Vamos carregá-los
pof_aluguel_estimado <- read_rds("./dados/pof_aluguel_estimado.rds")
pof_caderneta_coletiva <- read_rds("./dados/pof_caderneta_coletiva.rds")
pof_despesa_coletiva <- read_rds("./dados/pof_despesa_coletiva.rds")
pof_despesa_individual <- read_rds("./dados/pof_despesa_individual.rds")
pof_rendimento_trabalho <- read_rds("./dados/pof_rendimento_trabalho.rds")
pof_outros_rendimentos <- read_rds("./dados/pof_outros_rendimentos.rds")
A variável que tem o código dos itens é V9001. Antes de
tudo, precisamos checar quantos dígitos temos nos dados originais:
pof_aluguel_estimado %>% mutate(n_cod = nchar(V9001)) %>% distinct(n_cod)
## # A tibble: 1 × 1
## n_cod
## <int>
## 1 7
pof_caderneta_coletiva %>% mutate(n_cod = nchar(V9001)) %>% distinct(n_cod)
## # A tibble: 1 × 1
## n_cod
## <int>
## 1 7
pof_despesa_coletiva %>% mutate(n_cod = nchar(V9001)) %>% distinct(n_cod)
## # A tibble: 2 × 1
## n_cod
## <int>
## 1 6
## 2 7
pof_despesa_individual %>% mutate(n_cod = nchar(V9001)) %>% distinct(n_cod)
## # A tibble: 1 × 1
## n_cod
## <int>
## 1 7
pof_rendimento_trabalho %>% mutate(n_cod = nchar(V9001)) %>% distinct(n_cod)
## # A tibble: 1 × 1
## n_cod
## <int>
## 1 7
pof_outros_rendimentos %>% mutate(n_cod = nchar(V9001)) %>% distinct(n_cod)
## # A tibble: 1 × 1
## n_cod
## <int>
## 1 7
Podemos ver que, exceto em alguns casos no registro Despesa Coletiva, temos 7 dígitos. Como discutimos anteriormente, para o caso geral, basta eliminar os 2 últimos para termos o código da mesma forma que está na tabela tradutor. Em relação aos itens com 6 dígitos, isso é causado (igual a antes) pela variável QUADRO ter apenas um dígito. Lembrando, os dois primeiros dígitos do código de item corresponde ao quadro. Mas quando o valor da variável QUADRO é menor que 10, é registrado apenas um dígito (6 ao invés de 06). Então precisamos colocar esse dígito adicional no início. Para confirmar:
pof_despesa_coletiva %>%
mutate(n_cod = nchar(V9001)) %>%
filter(n_cod == 6) %>%
distinct(QUADRO)
## # A tibble: 4 × 1
## QUADRO
## <chr>
## 1 6
## 2 7
## 3 9
## 4 8
Assim,, fazemos:
pof_aluguel_estimado <- pof_aluguel_estimado %>%
mutate(codigo_5 = str_sub(V9001, 1, -3))
pof_caderneta_coletiva <- pof_caderneta_coletiva %>%
mutate(codigo_5 = str_sub(V9001, 1, -3))
pof_despesa_coletiva <- pof_despesa_coletiva %>%
mutate(V9001 = str_pad(V9001, 7, "left", "0")) %>%
mutate(codigo_5 = str_sub(V9001, 1, -3))
pof_despesa_individual <- pof_despesa_individual %>%
mutate(codigo_5 = str_sub(V9001, 1, -3))
pof_rendimento_trabalho <- pof_rendimento_trabalho %>%
mutate(codigo_5 = str_sub(V9001, 1, -3))
pof_outros_rendimentos <- pof_outros_rendimentos %>%
mutate(codigo_5 = str_sub(V9001, 1, -3))
Vamos checar se tudos têm 5 dígitos:
pof_aluguel_estimado %>% mutate(n_cod = nchar(codigo_5)) %>% distinct(n_cod)
## # A tibble: 1 × 1
## n_cod
## <int>
## 1 5
pof_caderneta_coletiva %>% mutate(n_cod = nchar(codigo_5)) %>% distinct(n_cod)
## # A tibble: 1 × 1
## n_cod
## <int>
## 1 5
pof_despesa_coletiva %>% mutate(n_cod = nchar(codigo_5)) %>% distinct(n_cod)
## # A tibble: 1 × 1
## n_cod
## <int>
## 1 5
pof_despesa_individual %>% mutate(n_cod = nchar(codigo_5)) %>% distinct(n_cod)
## # A tibble: 1 × 1
## n_cod
## <int>
## 1 5
pof_rendimento_trabalho %>% mutate(n_cod = nchar(codigo_5)) %>% distinct(n_cod)
## # A tibble: 1 × 1
## n_cod
## <int>
## 1 5
pof_outros_rendimentos %>% mutate(n_cod = nchar(codigo_5)) %>% distinct(n_cod)
## # A tibble: 1 × 1
## n_cod
## <int>
## 1 5
Aparentemente, tudo certo.
Essa etapa é, na minha opinião, a mais problemática. Lembrando, precisamos saber a variável certa, multiplicar o fator de anualização e, quando necessário, multiplicar pelo número de meses da despesa.
O primeiro passo é juntar a tabela tradutor em todos os registros da POF. Isso faz com que tenhamos, para cada despesa, a(s) variável(is) relevante(s) e o grupos ao qual cada gasto pertence (V8000_DEFLA, V531122_DEFLA, V531132_DEFLA, V1904_DEFLA, V531112_DEFLA, V8501_DEFLA).
Lembrando que determinadas despesas possuem mais de uma variável
associada (e, portanto, mais de um grupo de despesa). Nesses casos,
quando fazemos o left_join com a tabela tradutor,
teremos um aumento do número de linhas na nossa tabela final. Isso
acontece porque um mesmo código de despesa está associado a tipos
diferentes de despesa (no caso do rendimento do trabalho por exemplo, a
desconto de previdência pública, de imposto de renda e outros).
Mas esse é justamente o nosso objetivo. Antes de fazer o
join com a tabela tradutor, temos:
tamanho_antes <- bind_rows(
pof_aluguel_estimado %>%
summarise(nome = "aluguel_estimado",
n_linhas = n()),
pof_caderneta_coletiva %>%
summarise(nome = "caderneta_coletiva",
n_linhas = n()),
pof_despesa_coletiva %>%
summarise(nome = "despesa_coletiva",
n_linhas = n()),
pof_despesa_individual %>%
summarise(nome = "despesa_individual",
n_linhas = n()),
pof_rendimento_trabalho %>%
summarise(nome = "rendimento_trabalho",
n_linhas = n()),
pof_outros_rendimentos %>%
summarise(nome = "outros_rendimentos",
n_linhas = n())
)
Fazendo o join:
pof_aluguel_estimado <- pof_aluguel_estimado %>%
left_join(tradutor, by = c("codigo_5" = "codigo"))
pof_caderneta_coletiva <- pof_caderneta_coletiva %>%
left_join(tradutor, by = c("codigo_5" = "codigo"))
pof_despesa_coletiva <- pof_despesa_coletiva %>%
left_join(tradutor, by = c("codigo_5" = "codigo"))
pof_despesa_individual <- pof_despesa_individual %>%
left_join(tradutor, by = c("codigo_5" = "codigo"))
pof_rendimento_trabalho <- pof_rendimento_trabalho %>%
left_join(tradutor, by = c("codigo_5" = "codigo"))
pof_outros_rendimentos <- pof_outros_rendimentos %>%
left_join(tradutor, by = c("codigo_5" = "codigo"))
tamanho_depois <- bind_rows(
pof_aluguel_estimado %>%
summarise(nome = "aluguel_estimado",
n_linhas = n()),
pof_caderneta_coletiva %>%
summarise(nome = "caderneta_coletiva",
n_linhas = n()),
pof_despesa_coletiva %>%
summarise(nome = "despesa_coletiva",
n_linhas = n()),
pof_despesa_individual %>%
summarise(nome = "despesa_individual",
n_linhas = n()),
pof_rendimento_trabalho %>%
summarise(nome = "rendimento_trabalho",
n_linhas = n()),
pof_outros_rendimentos %>%
summarise(nome = "outros_rendimentos",
n_linhas = n())
)
left_join(tamanho_antes, tamanho_depois, by = "nome", suffix = c("_antes", "_depois"))
## # A tibble: 6 × 3
## nome n_linhas_antes n_linhas_depois
## <chr> <int> <int>
## 1 aluguel_estimado 48935 48935
## 2 caderneta_coletiva 789995 789995
## 3 despesa_coletiva 478572 488849
## 4 despesa_individual 1836032 1836032
## 5 rendimento_trabalho 97075 283369
## 6 outros_rendimentos 206108 206108
Os únicos registros que aumentaram o número de linhas foram: despesa coletiva e rendimento do trabalho. Em relação ao primeiro, o aumento é muito pequeno, pois ocorre apenas poucas despesas com manutenção do lar, como eletricista e mordomo (entre outros) para as quais há a despesa em si e recolhimento de INSS. Já para o rendimento o trabalho, o aumento é enorme, pois representa desconto de previdência, de IR e outros, muito mais comuns.
Agora, precisamos criar uma coluna valor que contenha o
valor único de cada código + grupo de despesa. Isso é feito através da
coluna variavel, originalmente na tabela tradutor. Nos
registros em que temos apenas uma variável relevante de despesa (as que
não mudaram o número de linhas depois do join), basta criar
uma nova coluna igual à já existente.
pof_aluguel_estimado <- pof_aluguel_estimado %>%
mutate(valor = V8000_DEFLA)
pof_caderneta_coletiva <- pof_caderneta_coletiva %>%
mutate(valor = V8000_DEFLA)
pof_despesa_individual <- pof_despesa_individual %>%
mutate(valor = V8000_DEFLA)
pof_outros_rendimentos <- pof_outros_rendimentos %>%
mutate(valor = V8501_DEFLA)
Nos dois casos especiais (despesa coletiva e rendimento do trabalho),
precisamos relacionar a variável certa em cada linha. Para isso, vamos
usar a função case_when:
pof_despesa_coletiva <- pof_despesa_coletiva %>%
mutate(valor = case_when(variavel == "V8000_DEFLA" ~ V8000_DEFLA,
variavel == "V1904_DEFLA" ~ V1904_DEFLA))
pof_rendimento_trabalho <- pof_rendimento_trabalho %>%
mutate(valor = case_when(variavel == "V531112_DEFLA" ~ V531112_DEFLA,
variavel == "V531122_DEFLA" ~ V531122_DEFLA,
variavel == "V531132_DEFLA" ~ V531132_DEFLA))
Agora, para todos os elementos na coluna valor, precisamos multiplicar pelo fator de anualização:
pof_aluguel_estimado <- pof_aluguel_estimado %>%
mutate(valor = as.numeric(valor),
FATOR_ANUALIZACAO = as.numeric(FATOR_ANUALIZACAO)) %>%
mutate(valor_fator_anu = valor*FATOR_ANUALIZACAO)
pof_caderneta_coletiva <- pof_caderneta_coletiva %>%
mutate(valor = as.numeric(valor),
FATOR_ANUALIZACAO = as.numeric(FATOR_ANUALIZACAO)) %>%
mutate(valor_fator_anu = valor*FATOR_ANUALIZACAO)
pof_despesa_coletiva <- pof_despesa_coletiva %>%
mutate(valor = as.numeric(valor),
FATOR_ANUALIZACAO = as.numeric(FATOR_ANUALIZACAO)) %>%
mutate(valor_fator_anu = valor*FATOR_ANUALIZACAO)
pof_despesa_individual <- pof_despesa_individual %>%
mutate(valor = as.numeric(valor),
FATOR_ANUALIZACAO = as.numeric(FATOR_ANUALIZACAO)) %>%
mutate(valor_fator_anu = valor*FATOR_ANUALIZACAO)
pof_rendimento_trabalho <- pof_rendimento_trabalho %>%
mutate(valor = as.numeric(valor),
FATOR_ANUALIZACAO = as.numeric(FATOR_ANUALIZACAO)) %>%
mutate(valor_fator_anu = valor*FATOR_ANUALIZACAO)
pof_outros_rendimentos <- pof_outros_rendimentos %>%
mutate(valor = as.numeric(valor),
FATOR_ANUALIZACAO = as.numeric(FATOR_ANUALIZACAO)) %>%
mutate(valor_fator_anu = valor*FATOR_ANUALIZACAO)
A última etapa é criar, de fato, o valor anualizado, multiplicando certas despesas pelo número de meses. Podemos saber quais são essas despesas olhando cada registro do dicionário de variáveis, na descrição da variável V9011. Lá diz quais os quadros cujos valores precisam ser multiplicados por essa variável.
O registro caderneta individual não tem a variável V9011, então não há alteração a ser feita. Nos registros aluguel estimado e rendimento do trabalho, todas as despesas precisam ser multiplicadas por V9011 Assim:
pof_aluguel_estimado <- pof_aluguel_estimado %>%
mutate(V9011 = as.numeric(V9011)) %>%
mutate(valor_anualizado = valor_fator_anu*V9011)
pof_caderneta_coletiva <- pof_caderneta_coletiva %>%
mutate(valor_anualizado = valor_fator_anu)
pof_despesa_coletiva <- pof_despesa_coletiva %>%
mutate(V9011 = as.numeric(V9011)) %>%
mutate(valor_anualizado = case_when(QUADRO %in% c("10","19") ~ valor_fator_anu*V9011,
TRUE ~ valor_fator_anu))
pof_despesa_individual <- pof_despesa_individual %>%
mutate(V9011 = as.numeric(V9011)) %>%
mutate(valor_anualizado = case_when(QUADRO %in% c("44","47","48","49","50") ~ valor_fator_anu*V9011,
TRUE ~ valor_fator_anu))
pof_rendimento_trabalho <- pof_rendimento_trabalho %>%
mutate(V9011 = as.numeric(V9011)) %>%
mutate(valor_anualizado = valor_fator_anu*V9011)
pof_outros_rendimentos <- pof_outros_rendimentos %>%
mutate(V9011 = as.numeric(V9011)) %>%
mutate(valor_anualizado = case_when(QUADRO == "54" ~ valor_fator_anu*V9011,
TRUE ~ valor_fator_anu))
Agora já temos todas as informações de despesa. O que falta agora é juntar tudo em uma tabela só (que podemos salvar para não ter que repetir esse processo). De fato, agora o que precisamos dos registros com os quais temos trabalhado é apenas: indicador de uc, as categorias de despesa e o valor.
pof_aluguel_estimado <- pof_aluguel_estimado %>%
mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
id_dom = str_c(COD_UPA, NUM_DOM),
id_uc = str_c(COD_UPA, NUM_DOM, NUM_UC)) %>%
select(id_dom, id_uc, codigo_5, valor_anualizado, PESO_FINAL,
nivel_0, descricao_0,
nivel_1, descricao_1,
nivel_2, descricao_2,
nivel_3, descricao_3,
nivel_4, descricao_4,
nivel_5, descricao_5)
pof_caderneta_coletiva <- pof_caderneta_coletiva %>%
mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
id_dom = str_c(COD_UPA, NUM_DOM),
id_uc = str_c(COD_UPA, NUM_DOM, NUM_UC)) %>%
select(id_dom, id_uc, codigo_5, valor_anualizado, PESO_FINAL,
nivel_0, descricao_0,
nivel_1, descricao_1,
nivel_2, descricao_2,
nivel_3, descricao_3,
nivel_4, descricao_4,
nivel_5, descricao_5)
pof_despesa_coletiva <- pof_despesa_coletiva %>%
mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
id_dom = str_c(COD_UPA, NUM_DOM),
id_uc = str_c(COD_UPA, NUM_DOM, NUM_UC)) %>%
select(id_dom, id_uc, codigo_5, valor_anualizado, PESO_FINAL,
nivel_0, descricao_0,
nivel_1, descricao_1,
nivel_2, descricao_2,
nivel_3, descricao_3,
nivel_4, descricao_4,
nivel_5, descricao_5)
pof_despesa_individual <- pof_despesa_individual %>%
mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
id_dom = str_c(COD_UPA, NUM_DOM),
id_uc = str_c(COD_UPA, NUM_DOM, NUM_UC)) %>%
select(id_dom, id_uc, codigo_5, valor_anualizado, PESO_FINAL,
nivel_0, descricao_0,
nivel_1, descricao_1,
nivel_2, descricao_2,
nivel_3, descricao_3,
nivel_4, descricao_4,
nivel_5, descricao_5)
pof_rendimento_trabalho <- pof_rendimento_trabalho %>%
mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
id_dom = str_c(COD_UPA, NUM_DOM),
id_uc = str_c(COD_UPA, NUM_DOM, NUM_UC)) %>%
select(id_dom, id_uc, codigo_5, valor_anualizado, PESO_FINAL,
nivel_0, descricao_0,
nivel_1, descricao_1,
nivel_2, descricao_2,
nivel_3, descricao_3,
nivel_4, descricao_4,
nivel_5, descricao_5)
pof_outros_rendimentos <- pof_outros_rendimentos %>%
mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
id_dom = str_c(COD_UPA, NUM_DOM),
id_uc = str_c(COD_UPA, NUM_DOM, NUM_UC)) %>%
select(id_dom, id_uc, codigo_5, valor_anualizado, PESO_FINAL,
nivel_0, descricao_0,
nivel_1, descricao_1,
nivel_2, descricao_2,
nivel_3, descricao_3,
nivel_4, descricao_4,
nivel_5, descricao_5)
Vamos criar agora nosso df com todas as informações de despesa para nossa análise.
pof_despesa <- bind_rows(pof_aluguel_estimado,
pof_caderneta_coletiva,
pof_despesa_coletiva,
pof_despesa_individual,
pof_rendimento_trabalho,
pof_outros_rendimentos) %>%
filter(is.na(nivel_0) == F)
Por fim, vamos salvar essa tabela como .rds.
pof_despesa %>% write_rds("./dados/pof_despesa.rds", compress = "gz")
Na próxima aula vamos replicar a tabela 6715 do SIDRA.